package main

import (
	"fmt"
	"sync"
	"time"
)

/**
计算 1-200 各个数的阶乘，并且把各个数的阶乘放到map,最后显示出来
*/

/*
*
定义个map存放结果
*/
var (
	myMap = make(map[int]int, 10)

	// 声明一个全局的互斥锁
	// lock 是一个全局的互斥锁
	// sync 包； synchornized 同步
	// Mutex 互斥
	lock sync.Mutex
)

func calcJC(num int) {

	res := 1
	for i := 1; i <= num; i++ {
		res *= i
	}
	lock.Lock()
	myMap[num] = res
	lock.Unlock()
}

/*
并发main
*/
func main() {
	// 主线程休眠10秒钟
	time.Sleep(time.Second * 10)
	// 开启协程
	for j := 1; j <= 200; j++ {

		// 并发写入map报错
		// fatal error: concurrent map writes
		go calcJC(j)

		// go build -race 生成 exe文件执行

	}

	fmt.Println(myMap)
}

/*
同步main 写法
*/
/*func main() {

	for j := 1; j <= 200; j++ {
		calcJC(j)
	}

	fmt.Println(myMap)
}*/
